// 导入创建数据仓储对象的方法createStore
import { createStore, applyMiddleware } from 'redux';
import axios from 'axios';
// 导入副作用方法
import { all, put, call, takeLatest } from 'redux-saga/effects';
import createSagaMiddleware from 'redux-saga';
// 编写reducer函数
// 状态数的初始值
const initData = {
    goodsList: [
        // {
        //     id: 1,
        //     goodsname: '特斯拉',
        //     price: '30w'
        // },
        // {
        //     id: 2,
        //     goodsname: '小鹏',
        //     price: '20w'
        // }
    ]
}
// state: 状态数据, 必须提供初始值
// action: 数据操作对象{type:'操作类型',payload:'操作数据需要的参数'}
function reducer(state = initData, action) {
    switch (action.type) {
        // 商品列表初始化
        case 'goods/init':
            state.goodsList = action.payload;
            return {
                ...state, goodsList: [...state.goodsList]
            }
        // 移除商品
        case 'goods/remove':
            // action.payload: 商品对象在商品列表数组中的索引号
            state.goodsList.splice(action.payload, 1);
            return { ...state, goodsList: [...state.goodsList] }
        // 添加商品
        case 'goods/add':
            const len = state.goodsList.length;
            const id = len > 0 ? state.goodsList[len - 1].id + 1 : 1;
            const goods = { id, ...action.payload }
            state.goodsList.push(goods);
            return {
                ...state, goodsList: [...state.goodsList]
            }
        // 更新商品
        case 'goods/update':

            break;
        default:
            return state;
    }
}

// 创建redux-saga中间件
const SagaMiddleware = createSagaMiddleware();

// 请求商品列表: 异步操作通过saga来处理
function* goodsListInit() {
    // 监听组件派发的action操作
    yield takeLatest('goods/init/async', function* (params) {
        // 请求数据接口
        const { data } = yield call(axios.get, 'http://localhost:3001/api/getnew');
        if (data.code === 200) {
            // 将请求结果派发给reducer函数, 由reducer函数完成数据操作
            yield put({ type: 'goods/init', payload: data.list });
        }
    })
}

// 创建rootSaga
function* rootSaga() {
    // 调用所有的saga generator函数
    yield all([
        call(goodsListInit)
    ])
}

// 创建数据仓储对象 && 注册redux-saga中间件
const store = createStore(reducer, applyMiddleware(SagaMiddleware));

// 运行rootSaga
SagaMiddleware.run(rootSaga);

// 导出数据仓储对象
export default store;
